ハッシュ:リサイズ戦略

香港理工大學 DSAI2201第13講義2025年11月25日

再ハッシュの必要性

検索および挿入の望ましいO(1)O(1)平均ケース性能を保証するためには、負荷係数(λN/Mλ = N/M)は厳密に上限値に制限されなければなりません。ここでNNは要素数であり、MMはテーブルの容量です。

もしλλが無制限に増加すると、衝突が指数的に増加し、平均時間計算量はO(N)O(N)に低下します。

条件発生する操作影響
λλmaxλ < λ<sub>max</sub>標準的なO(1)O(1)挿入最適な効率が維持されます。
λλmaxλ ≥ λ<sub>max</sub>リサイズ(再ハッシュ)を回復させますが、一時的にO(1)O(1)のパフォーマンスを確保しますが、一時的なO(N)O(N)コストがかかります。

一般的な閾値(λmaxλ<sub>max</sub>):0.70~0.75。

リサイズのプロセス

リサイズには、現在テーブル内にあるすべてのアイテムについてハッシュインデックスを再計算する必要があり、このプロセスは再ハッシュに低下します。

  1. 新しい容量の決定:新しい容量MnewM<sub>new</sub>を設定します。通常、現在の容量の2倍(Mnew2MM<sub>new</sub> = 2M)とします。これにより、新しいλλは臨界閾値の半分になります。
  2. テーブルの作成:新しいハッシュテーブル配列(サイズMnewM<sub>new</sub>に低下します。
  3. アイテムの反復処理:古いテーブル内のすべてのNN既存の要素をループ処理します。
  4. 再ハッシュ:各キーkkについて、更新されたモジュラスを使って新しいインデックスを計算します: indexh(k)(modMnew) \text{index}' = h(k) \pmod{M_{new}}
  5. 挿入:アイテムを新しいテーブルのindexindex′に低下します。

注:モジュラスが変更されるため、単純に配列をコピーすることは不可能です。すべてのアイテムを再挿入する必要があります。

アモアライズドコスト

なぜリサイズがO(N)O(N)

リサイズにはすべてのNN要素を処理する必要があり、その操作自体はO(N)O(N)の時間を要します。これは、O(1)O(1)挿入の目標を一時的に違反します。

アモアライズド解析

このコストを正当化するためにアモアライズド解析を使用します。テーブルがリサイズごとにサイズを2倍にする(指数成長)場合、高価なO(N)O(N)コストは、間に続く多くのO(1)O(1)挿入に分散されます。

任意の1つの挿入の平均コストは、定期的な任意の挿入を考慮に入れてもO(N)O(N)リサイズを含めてもO(1)O(1)に低下します。

📝 インタラクティブクイズ

1. ハッシュマップの容量がM50M=50で最大負荷係数がλmax0.6λ<sub>max</sub> = 0.6であるとき、何個の要素(NN)を超える時点でリサイズがトリガーされるべきですか?

  • A) N25N = 25
  • B) N30N = 30
  • C) N31N = 31
  • D) N50N = 50

2. リサイズ中に、古いテーブルの要素をそのまま新しい大きなテーブルにコピーできない理由は何ですか?

  • A) 再ハッシュより計算的に遅くなるから。
  • B) ハッシュインデックスはテーブルの容量(MM)に依存しており、それが変更されたから。
  • C) メモリのフラグメンテーションが起こるから。
  • D) 古いデータは読み取り専用状態だから。

3. リサイズ時にサイズを2倍にするハッシュテーブルにおける挿入のアモアライズド時間計算量はどれですか?

  • A) O(N)O(N)
  • B) O(1)O(1)
  • C) O(logN)O(log N)
  • D) O(NlogN)O(N log N)

4. 負荷係数が高くなりすぎたときにハッシュテーブルのリサイズを行わない場合の主な結果は何ですか?

  • A) パフォーマンスがO(N)O(N)に低下する。衝突が増加するため。
  • B) テーブルはすぐにメモリ不足になる。
  • C) ハッシュ関数自体が無効になる。
  • D) テーブルは自動的に最も古い要素を削除する。